約 4,392 件
https://w.atwiki.jp/mcforum/pages/3.html
更新履歴 ここを編集
https://w.atwiki.jp/mcforum/pages/60.html
1.VRChat SDK VRChat公式にログインして、SDKをダウンロードする Unityの対応版(執筆時点で5.6.3p1)をインストールしていない場合は一緒にダウンロードする SDKはAssetsメニューのImport PackageからCustom Packageを選択して、ファイル選択ダイアログでダウンロードしてきたSDKを選択する 2.Dynamic Bone UnityのWindowメニューからAsset storeを開いて購入、インポートする 3.モデルの読み込み fbxファイルとテクスチャファイルをまとめてProjectにドロップ。 4.モデルの設定 Blenderのテクスチャ表示のモデルが一番滑らかなのでこれに合わせたい… という要望については読み込んだfbxを選択した状態で、InspectorのModel画面からNormals Tangent で NormalsをNoneにすると大体一緒の見た目になる。まともにレンダリングするとポリゴンの粗が目立つので苦肉の策。ちゃんとモデリングできてるなら多分不要な操作。 あとRigの画面でHumanoidを選択 Applyで反映する。Configure...ボタンの左側にチェックが付けばOKらしい。Humanoidの条件をボーンが満たしていないと多分エラーする?Configure...ボタン押してやるとボーンの認識状況の確認等ができる。 あとはマテリアルの設定、NormalsをNoneにしてるせいかSmoothnessが掛かってるとぼんやりするので左端までスライドしてはっきりさせる。ここら辺のレンダー設定はお好み。 5.モデルの配置 ProjectのfbxファイルをSceneにドロップして、Transformから座標を0,0,0に設定。(アップロード時の撮影が大体このへん?) 6.Dynamic Boneの設定 今回一番複雑そうなスカートの設定を載せて置く。胸に設定するのもボーンが少ないだけで操作は一緒。 Blender側で揺らしたい範囲に最寄りのボーンから押し出しでボーンを通して、それぞれのボーンに影響範囲のウェイトペイントをしておくこと。 まず最初にスカートのそれぞれのボーンのルート(連なってるうち一番根本に近いボーン)をまとめて選択して、Add Component から Dynamic Bone を追加する。 今度は個別に、それぞれのルートのボーンを Dynamic Bone の Root の項にドロップして登録していく 衝突判定する太もも側は纏めて選択したあと Dynamic Bone Collider を Add Component する 再度スカートのルートボーンを全選択して、上で Dynamic Bone Collider をつけた太もものボーンを Dynamic Bone の Colliders の項にひとつずつドロップして登録する。 太もも側の設定は、衝突判定のカプセルの設定。CenterやらRadiusやらHeightやらを調整して、二つの球の位置を調整して衝突範囲の設定をする。多分二つの球の間に衝突判定が存在しているはず? スカート側の設定、ここのパラメータでふんわり具合を設定するのと、Radiusでスカート側の衝突判定球のサイズ設定をする。スカート側はあくまでボーンを中心に衝突判定が構築されるので、BlenderでBone入れるときはスカートのポリゴンよりちょっと内側にボーン入れておくと多少は貫通し辛くなるのかなと思う。 パラメータの解説はなんとなくこの辺を参考にする。 7.VRChatの設定 Sceneに追加したfbxのオブジェクトをHierarchyから選択して Script - VRCSDK2 - VRChat_Avatar Descriptor をAdd Componentする。(一緒にPipeline Managerってのも勝手に追加される) View Position(VRC内での視点の位置)を弄ると灰色の球が移動するので目と目の間らへんにする。なお数値入力の場合は球の位置が即時反映されるが、XとかYとか掴んでドラッグで数値変更すると即時反映されないかも。キャラクターのポジションを0,0,0にしてあれば、View Positionの0,0,0からY座標弄っていけば灰色球が見つかりやすいと思われる。あと性別を選択しておくこと(モーションの選択らしい)。 既存のアップロード済みアバターがある場合は、Pipeline ManagerのBlueprint IDにIDを入れてAttachしておくと上書きできる。 8.VRChatサーバーへアップロード メニューの VRChat SDK から Show Build Control Panel を選択するとダイアログが表示されるので、 Build Publish ボタンを押す。 ゲーム画面にアップロードのための登録画面が表示されるので、アバター名や説明、公開設定などをしたうえでUploadボタンを押すとアップロードできる。
https://w.atwiki.jp/mcforum/pages/7.html
アーカイブ @wikiのwikiモードでは #archive_log() と入力することで、特定のウェブページを保存しておくことができます。 詳しくはこちらをご覧ください。 =>http //atwiki.jp/guide/25_171_ja.html たとえば、#archive_log()と入力すると以下のように表示されます。 保存したいURLとサイト名を入力して"アーカイブログ"をクリックしてみよう サイト名 URL
https://w.atwiki.jp/mcforum/pages/27.html
コメント欄設けてみた - ecolight 2014-01-26 02 48 26 ミスって136資源のレンガ壊してしまいました - yakituka 2014-09-27 13 45 43 わーい - sdust 2014-01-26 03 29 58 わーわー - utiuti1128 2014-01-26 03 30 45 tatunori1110477 - うほー 2014-01-26 10 03 22 tatunori1110477 - 逆になってたww 2014-01-26 10 03 37 わーわー - カカZ 2014-02-15 21 11 55 banされてしまいましたちゃんと直しますのでban解除お願いしたいです - yakituka 2014-09-27 13 47 35 慣れ合いはNG - 名無しさん 2014-10-11 01 24 43 お前に俺は - 捕まえられん 2014-12-28 13 57 29 興味があって来たら・・・出来れば活性化させたいですねここ - 名無しさん 2015-05-14 21 56 02 今度はEmpyrionはどうですか?マルチプレイも面白いですよ。 - 名無しさん (2018-06-26 22 31 15) ここに載ってないだけでEmpyrionもドはまりした身です。はい。 - sdust (2019-03-26 12 33 40)
https://w.atwiki.jp/mcforum/pages/21.html
最初はランチャーをダウンロードして、インストールボタンでインストール ゲーム開始するとこの画面になるのでSPAWNで開始 チュートリアルは以降の節を読むならSKIPしても良いかもしれない。 英語がなんとなくわかる人はこのページで書いてない事もあるのでこなしてみると良い。 以降は画像中に説明を書いてるよ
https://w.atwiki.jp/mcforum/pages/53.html
Thuruster Override 以下そーす IMyTerminalBlockで取り出してキャストして使っても、最初っからIMyThrusterで取り出して使っても中身は同じもの。 is IMyThrust で本当にThrusterだよねって確認はしておいた方が良い IncreaseOverrideとDecreaseOverrideが実行できるので、Overrideの値と目標値を比較してfor文で繰り返し実行することで目標値までOverrideするような関数が作れるはず。 これをコマンドブロックに書いて、タイマーブロックから適当な秒周期で呼び出す。タイマーブロックに自身のタイマーブロックのstartアクション登録しておいてループ化。 作成 ecolight //--------------------------------------------------------------------------------------------------- // Load TextPanel IMyTextPanel p = GridTerminalSystem.GetBlockWithName("Text panel") as IMyTextPanel; // check result for PanelObject if (p == null) { return -1; } //--------------------------------------------------------------------------------------------------- // Load Thruster // case IMyTerminalBlock // IMyTerminalBlock t = GridTerminalSystem.GetBlockWithName("Thruster") as IMyTerminalBlock; // case IMyThrust // IMyThrust t = GridTerminalSystem.GetBlockWithName("Thruster") as IMyThrust; IMyThrust t = GridTerminalSystem.GetBlockWithName("Thruster") as IMyThrust; // check result for Thruster if (t == null) { p.WritePublicText(" [ERROR] Thruster Offline", false); return -2; } // check type if (!(t is IMyThrust)) { p.WritePublicText(" [ERROR] invalid Thruster", false); return -3; } //--------------------------------------------------------------------------------------------------- // case IMyTerminalBlock // p.WritePublicText(" [INFO] " + (t as IMyThrust).ThrustOverride + " p", false); // case IMyThrust // p.WritePublicText(" [INFO] " + t.GetValueFloat("Override") + " p", false); p.WritePublicText(" [INFO] Thruster Overide\n", false); p.WritePublicText(" [INFO] Power " + t.GetValueFloat("Override") + " N", true); // case IMyTerminalBlock // (t as IMyThrust).GetActionWithName("IncreaseOverride").Apply(t); // case IMyThrust // t.GetActionWithName("IncreaseOverride").Apply(t); t.GetActionWithName("IncreaseOverride").Apply(t); //---------------------------------------------------------------------------------------------------
https://w.atwiki.jp/mcforum/pages/93.html
目次 できたもの 前提 素材集め 葵ちゃんをPrefab化 クリックしたら葵ちゃんを増やして散らせる できたもの 前提 Unity クリッカーゲームを作ってみたい/01-茜ちゃんをクリックしてアニメーションさせるの続き 素材集め + 詳細を開く 権利を確認しながら素材を集める。 茜ちゃんと同じ製作者さんの葵ちゃん散らすことにする。 デフォルメ茜ちゃん https //seiga.nicovideo.jp/seiga/im8387118 キャラクター使用ガイドライン https //aivoice.jp/character/kotonoha/ 葵ちゃんをPrefab化 + 詳細を開く まず前回の茜ちゃん同様、適当に画像ファイル郡をAssetsに格納し、Sceneかヒエラルキーにドロップで配置する 名前は管理上わかりやすくするため"葵"にしておく 後に大量に散らせる予定であるが、茜ちゃんと比較していい感じのサイズ感にしておく。 また、この後物理演算に任せるため RigidBody 2D と Capsule Collider 2D のコンポーネントをつけておく Gravity Scale は 2 ぐらいにしておく (再生しながらお好みで変更、後で調整でも良い) Capsule Collider 2D のサイズはいい感じのサイズにしておく。 葵ちゃん同士で重なることを考えると体のグラフィックの範囲内に収まった方が違和感が無いと思われる。 AssetsにPrefabディレクトリを作成し、ヒエラルキーにある"葵"インスタンスを掴み Assets/Prefab ディレクトリにドロップする。 また、ヒエラルキーの"葵"インスタンスは削除しておく。 今後葵ちゃんに何か編集する場合はPrefabを選択してインスペクターで操作すること。 場合によっては一旦Sceneに配置して、編集してから配置したインスタンスのインスペクターから Overrides メニューの Apply All を用いてPrefabに上書きしても良い。 クリックしたら葵ちゃんを増やして散らせる + 詳細を開く ざっくりした仕様 クリックしたら茜ちゃんの中心座標から葵ちゃん出現させる 上左右方向180度のランダムな方向に射出する 重力に従って葵ちゃんが落下する 射出された葵ちゃんはランダムな回転速度でくるくる回る 上記を満たすスクリプトを、クリック時のスクリプトに追記する。 using System.Collections;using System.Collections.Generic;using UnityEngine; public class Click MonoBehaviour{ Animator anime; // 生成するprefab を簡単に差し替えできるよう public で外部から変更できるようにしておく public GameObject prefab; // 速度は適切な速度を探れるように、publicで外部から変更できるようにしておく public float prefabSpeed = 1000; public float prefabTorque = 300; void Start() { anime = GetComponent Animator (); } void Update() { if (Input.GetMouseButtonDown(0)) { anime.SetTrigger("click_cancel"); anime.SetTrigger("click"); // prefab からインスタンスを生成 GameObject aoi = Instantiate(prefab, gameObject.transform.position, Quaternion.identity); Rigidbody2D aoiBody = aoi.GetComponent Rigidbody2D (); // 上方向のランダムな方向を決定 Vector2 direction = Random.insideUnitCircle.normalized; direction.y = Mathf.Abs(direction.y); // ランダムな回転速度を決定、整数にしたとき2で割り切れない場合は逆回転にする float torque = Random.value; if ((int)(torque*100) % 2 == 1) { torque *= -1; } // 生み出した葵ちゃんに力を与える aoiBody.AddForce(direction * prefabSpeed, ForceMode2D.Force); aoiBody.AddTorque(torque * prefabTorque, ForceMode2D.Force); } }}
https://w.atwiki.jp/mcforum/pages/92.html
プロジェクトの作成 とりあえず空の2Dプロジェクトを作成 エディタはListのインスペクターでの登録を使用したいので2020.02以降(LTSで選ぶなら2020.3等) 自動保存設定 Asset store からAutosaver入手/import Edit/PreferencesにAutosaveが追加され各種設定が表示される。とりあえず初期設定で進める。
https://w.atwiki.jp/mcforum/pages/97.html
目次 前提 概要 スクリプトを見直すICounterReceiver Click GameController AkaneController AoiController CounterTextController MenuMouseOver TriggerDestroy Save Load Reset Clear オブジェクトの関連付け等を見直すオブジェクト名の変更と位置変更 各種設定変更パネルと葵ちゃんの接触判定を削除 + メニューマウスオーバーが葵ちゃんを誤検出しないよう修正 GameController のスクリプト設定 AoiController にクリック時に出現させる葵ちゃんのPrefabと出現位置を登録 AkaneController に茜ちゃんのオブジェクトを登録 前提 Unity クリッカーゲームを作ってみたい/05-マウスオーバーで表示されるメニューとSave&Load機能をつけるの続き 概要 今後の拡張を見据えて、少し雑になっていたオブジェクト関係を見直し それに伴いスクリプトの内容も見直し 茜ちゃん関連の操作は、トップレベルにいる AkaneController オブジェクトに実行させる 葵ちゃん関連の操作は、トップレベルにいる AoiController オブジェクトに実行させる AkaneController/AoiController は GameController からのカウント変更通知を受けて動作させる スクリプトを見直す ICounterReceiver 変更無し + 詳細を開く public interface ICounterReceiver{ public void UpdateCounter(int count);} Click クリックしたら GameController にインクリメントを依頼するだけの処理に変更 茜ちゃんの Click スクリプトコンポーネントは削除し、GameController オブジェクトに Click スクリプトを付け替え。 + 詳細を開く using UnityEngine; public class Click MonoBehaviour{ GameController gameCtrl; void Start() { gameCtrl = GameObject.FindObjectOfType GameController (); } void Update() { if (!gameCtrl.clickable) { return; } if (Input.GetMouseButtonDown(0)) { // クリック数をインクリメントし、ゲームコントローラー経由で全体に通知する gameCtrl.IncrementCount(); } }} GameController 本クラスで実施していた葵ちゃん制御関連の関数は、AoiController に移動 AoiController/AkaneController は本オブジェクトの counterReceivers にインスペクターから登録するよう変更 + 詳細を開く using System.Collections.Generic;using UnityEngine; public class GameController MonoBehaviour{ public static GameController instance; // カウンタの通知を受けるオブジェクトのリスト(インスペクターより登録) public List GameObject counterReceivers; public bool clickable; int clickCount; Click click; void Awake() { // シーンを跨いでGameControllerがいた場合用にシングルトン実装 if (instance == null) { instance = this; } else { Destroy(gameObject); } } void Start() { // オブジェクトを永続化 DontDestroyOnLoad(gameObject); clickable = true; click = GameObject.FindObjectOfType Click (); } void notifyCount(int count) { // 指定されたカウント値を、登録オブジェクト全てに通知 foreach (GameObject obj in counterReceivers) { ICounterReceiver receiver = obj.GetComponent ICounterReceiver (); if (receiver != null) { receiver.UpdateCounter(count); } } } public void IncrementCount() { // カウンタをインクリメントして、登録オブジェクト全てに通知 clickCount++; notifyCount(clickCount); } public void SetCount(int count) { // 設定されたカウンタ値を、登録オブジェクト全てに通知 clickCount = count; notifyCount(clickCount); } public int GetCount() { // カウンタ値を返却 return clickCount; }} AkaneController 茜ちゃん制御用のクラスを新規作成 Clickで実施していたアニメーションの制御を本クラスに移動し、UpdateCounter(カウンタ変更通知)で実施するよう変更 + 詳細を開く using UnityEngine; public class AkaneController MonoBehaviour, ICounterReceiver{ public GameObject akane; Animator anime; void Start() { anime = akane.GetComponent Animator (); } public void UpdateCounter(int count) { // 数値変動に応じてアニメーションする anime.SetTrigger("click_cancel"); anime.SetTrigger("click"); }} AoiController 葵ちゃんを生成する処理及び数の調整用関数を本クラスに移動 それに伴い葵ちゃんを生成する位置は、外部から GameObject を登録する事で同座標に出現させるよう変更 葵ちゃんは AoiController 配下に生成されるよう変更し、検索も AoiController 配下のオブジェクトをカウントするよう変更 + 詳細を開く using UnityEngine; public class AoiController MonoBehaviour, ICounterReceiver{ public GameObject prefab; // 生成するprefab を簡単に差し替えできるよう public で外部から変更できるようにしておく public GameObject posTarget; // 葵ちゃんを出現させる地点をオブジェクトで指定する // 速度は適切な速度を探れるように、publicで外部から変更できるようにしておく public float prefabSpeed = 1000; public float prefabTorque = 300; public void UpdateCounter(int count) { // 数値変動に応じて葵ちゃんの数を増減させる AdjustAoiChan(count); } public void spawnAoi() { // prefab からインスタンスを生成 GameObject aoi = Instantiate(prefab, posTarget.transform.position, Quaternion.identity); Rigidbody2D aoiBody = aoi.GetComponent Rigidbody2D (); // 葵ちゃんの親を AoiController に設定する aoi.transform.SetParent(gameObject.transform); // 上方向のランダムな方向を決定 Vector2 direction = Random.insideUnitCircle.normalized; direction.y = Mathf.Abs(direction.y); // ランダムな回転速度を決定、整数にしたとき2で割り切れない場合は逆回転にする float torque = Random.value; if ((int)(torque*100) % 2 == 1) { torque *= -1; } // 生み出した葵ちゃんに力を与える aoiBody.AddForce(direction * prefabSpeed, ForceMode2D.Force); aoiBody.AddTorque(torque * prefabTorque, ForceMode2D.Force); } void AdjustAoiChan(int target) { // 今いる葵ちゃんの数をカウント int now = transform.childCount; // 今いる人数の方が多い場合は葵ちゃんには消えてもらう foreach (Transform aoi in transform) { if (now = target) { break; } Destroy(aoi.gameObject); now--; } // 今いる人数の方が少ない場合は葵ちゃんを生み出す while (now target) { spawnAoi(); now++; } }} CounterTextController 変更無し + 詳細を開く using UnityEngine;using TMPro; public class CounterTextController MonoBehaviour, ICounterReceiver{ TextMeshProUGUI tmp; void Start() { tmp = gameObject.GetComponent TextMeshProUGUI (); } public void UpdateCounter(int count) { tmp.text = count + " あおい~"; }} MenuMouseOver 変更無し + 詳細を開く using UnityEngine; public class MenuMouseOver MonoBehaviour{ Animator anime; GameController gameCtrl; private void Start() { gameCtrl = GameObject.FindObjectOfType GameController (); anime = gameObject.GetComponent Animator (); } void OnMouseEnter() { anime.SetTrigger("open"); gameCtrl.clickable = false; } void OnMouseExit() { anime.SetTrigger("close"); gameCtrl.clickable = true; }} TriggerDestroy 葵ちゃん削除用の壁の名前を "Dead" で始まるように変更し、削除用の壁に触れたときのみ削除するよう判定を修正 これによりメニューパネルの Collider で IsTrigger 設定を有効(接触判定を無効)にしても誤削除がされなくなる + 詳細を開く using UnityEngine; public class TriggerDestroy MonoBehaviour{ void OnTriggerEnter2D(Collider2D other) { if (other.name.StartsWith("Dead")) { Destroy(gameObject); } }} Save 変更無し + 詳細を開く using UnityEngine;using TMPro; public class Save MonoBehaviour{ GameController gameCtrl; TextMeshProUGUI tmp; void Start() { gameCtrl = GameObject.FindObjectOfType GameController (); tmp = GameObject.FindObjectOfType CounterTextController ().gameObject.GetComponent TextMeshProUGUI (); } public void OnClick() { PlayerPrefs.SetInt("Count", gameCtrl.GetCount()); PlayerPrefs.Save(); tmp.text += "(せーぶしました)"; }} Load GameController に最新の数値を通知するのみの処理に変更 (GameController による全体へのカウンタ更新通知で反映される) + 詳細を開く using UnityEngine;using TMPro; public class Load MonoBehaviour{ GameController gameCtrl; TextMeshProUGUI tmp; void Start() { gameCtrl = GameObject.FindObjectOfType GameController (); tmp = GameObject.FindObjectOfType CounterTextController ().gameObject.GetComponent TextMeshProUGUI (); } public void OnClick() { // 葵ちゃんの数を調整する int target = PlayerPrefs.GetInt("Count"); gameCtrl.SetCount(target); tmp.text += "(ろーどしました)"; }} Reset GameController にカウンタ 0 を通知するのみの処理に変更 (GameController による全体へのカウンタ更新通知で反映される) + 詳細を開く using UnityEngine;using TMPro; public class Reset MonoBehaviour{ GameController gameCtrl; TextMeshProUGUI tmp; void Start() { gameCtrl = GameObject.FindObjectOfType GameController (); tmp = GameObject.FindObjectOfType CounterTextController ().gameObject.GetComponent TextMeshProUGUI (); } public void OnClick() { // 葵ちゃんの数をリセットする gameCtrl.SetCount(0); tmp.text += "(りせっとしました)"; }} Clear 変更無し + 詳細を開く using UnityEngine;using TMPro; public class Clear MonoBehaviour{ TextMeshProUGUI tmp; void Start() { tmp = GameObject.FindObjectOfType CounterTextController ().gameObject.GetComponent TextMeshProUGUI (); } public void OnClick() { PlayerPrefs.DeleteKey("Count"); tmp.text += "(せーぶをクリアしました)"; }} オブジェクトの関連付け等を見直す オブジェクト名の変更と位置変更 葵ちゃんを削除する機能を持った壁類はDeadで始まるように変更 それ以外は任意 AkaneController/AoiController を追加 茜オブジェクトは AkaneController 配下に変更 ※葵ちゃんもAoiController配下に作成される + 詳細を開く 各種設定変更 パネルと葵ちゃんの接触判定を削除 + メニューマウスオーバーが葵ちゃんを誤検出しないよう修正 IsTriggerの有効化 これによりメニューと葵ちゃんが接触しなくなるよう変更 葵ちゃんのPrefabを Ignore Raycast レイヤーに変更 これによりメニューと重なってもマウスオーバーを誤検出しなくなる + 詳細を開く GameController のスクリプト設定 リストに AkaneController と AoiController のオブジェクトを追加 これにより茜ちゃん葵ちゃん関連の処理は、カウンタ値の更新通知で駆動するように変更 茜ちゃんに付けていた Click スクリプトを剥がして本オブジェクトに付け替え(茜ちゃんと言うより画面のクリックなので) + 詳細を開く AoiController にクリック時に出現させる葵ちゃんのPrefabと出現位置を登録 + 詳細を開く AkaneController に茜ちゃんのオブジェクトを登録 配下にいるので検索できなくも無いが処理削減 + 詳細を開く
https://w.atwiki.jp/mcforum/pages/12.html
コメントプラグイン @wikiのwikiモードでは #comment() と入力することでコメントフォームを簡単に作成することができます。 詳しくはこちらをご覧ください。 =>http //atwiki.jp/guide/17_60_ja.html たとえば、#comment() と入力すると以下のように表示されます。 名前 コメント